﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using SOAPServices.Dominio;
using SOAPServices.Persistencia;
using System.Messaging;

namespace SOAPServices
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "Detracciones" en el código, en svc y en el archivo de configuración a la vez.
    public class Detracciones : IDetracciones
    {

        private DetraccionDAO detraccionDAO = null;
        private DetraccionDAO DetraccionDAO
        {
            get
            {
                if (detraccionDAO == null)
                    detraccionDAO = new DetraccionDAO();
                return detraccionDAO;
            }
        }


        private Message Receive(MessageQueue queue)
        {
            try
            {
                return queue.Receive(TimeSpan.Zero);
            }
            catch (MessageQueueException mqe)
            {
                if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
                    return null;
                throw;
            }
        }


        public Dominio.Detraccion registrarDetraccion(Dominio.Detraccion detraccionACrear)
        {
            Detraccion detraccion = null;

            //Ruta de donde se leerán los mensajes
            string rutaDetraccionIn = @".\private$\bancoin";
            if (MessageQueue.Exists(rutaDetraccionIn))
            {
                //Buscar en la ruta el mensaje
                MessageQueue colaDetraccionIn = new MessageQueue(rutaDetraccionIn);
                //Formatear el objecto mensaje
                colaDetraccionIn.Formatter = new XmlMessageFormatter(new Type[] { typeof(Detraccion) });
                //Se usa el objeto Detraccion. Primero validamos si existen registro  
                if (colaDetraccionIn.GetAllMessages().Count() > 0)
                {
                    Message mensajeIn;
                    //Recibe el mensaje y empieza a leer todas las colas
                    while ((mensajeIn = Receive(colaDetraccionIn)) != null)
                    {
                        //Obtener el objecto despues de ser casteado
                        detraccion = (Detraccion)mensajeIn.Body;
                        //Registrar el objeto
                        DetraccionDAO.Crear(detraccion);

                    }
                }

            }
            return detraccion;
        }
    }
}

